package com.itheima.service;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.RedisConstant;
import com.itheima.dao.SetmealDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Setmeal;
import org.apache.zookeeper.Op;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.JedisPool;

import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.stream.Collectors;

/**
 * 类 名: SetmealServiceImpl
 * 描 述:体检套餐实现类
 * 作 者: 蔡畅
 * 创 建：2019年11月22日
 */
@Service(interfaceClass = SetmealService.class)
@Transactional
public class SetmealServiceImpl implements SetmealService {
    @Autowired
    private SetmealDao setmealDao;
    private JedisPool jedisPool;
//    /**
//     * 新增套餐
//     *
//     * @param setmeal
//     */
//    @Override
//    public void add(Setmeal setmeal) {
//        //保持套餐基本信息（返回主键）
//        setmealDao.add(setmeal);
//        Integer setmealId = setmeal.getId(); // useGeneratedKeys="true" keyProperty="id"
//        //循环插入检查组和套餐的关系
//        List<Integer> checkgroupIds = setmeal.getCheckgroupIds();
//        if(CollectionUtil.isNotEmpty(checkgroupIds)){//不为空才循环
//            for (Integer checkgroupId : checkgroupIds) {
//                setmealDao.setCheckGroupAndSetmealRelation(checkgroupId,setmealId);
//            }
//        }
//    }


    /**
     * 新增套餐
     *
     * @param setmeal
     * @param checkgroupIds
     */
    @Override
    public void add(Setmeal setmeal, Integer[] checkgroupIds) {
        setmealDao.add(setmeal);
        if (checkgroupIds != null && checkgroupIds.length > 0) {
            //绑定套餐和检查组的多对多关系
            setSetmealAndCheckGroup(setmeal.getId(), checkgroupIds);
            //将图片名称保存到Redis
            savePic2Redis(setmeal.getImg());
        }
    }
    //分页查询
    @Override
    public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage,pageSize);
        Page<Setmeal> page = setmealDao.selectByCondition(queryString);
        return new PageResult(page.getTotal(),page.getResult());
    }

    //将图片名称保存到Redis
    private void savePic2Redis(String pic){
        jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,pic);
    }


    //绑定套餐和检查组的多对多关系
    private void setSetmealAndCheckGroup(Integer id, Integer[] checkgroupIds) {
        for (Integer checkgroupId : checkgroupIds) {
            Map<String, Integer> map = new HashMap<>();
            map.put("setmeal_id", id);
            map.put("checkgroup_id", checkgroupId);
            setmealDao.setSetmealAndCheckGroup(map);
        }
    }

    //查询所有
    @Override
    public List<Setmeal> findAll() {
        return setmealDao.findAll();
    }


    //根据检查组获取检查项
    @Override
    public Setmeal getSetmealById(Integer id) {
        //1、查询套餐本身详情数据
        Setmeal setmeal = setmealDao.getSetmealById(id);
        if (setmeal != null) {
            //2、查询套餐对应的检查组
            Integer setmealId = setmeal.getId();
            //根据setmealId查询套餐对应的检查组
            List<CheckGroup> checkGroupList = setmealDao.listCheckGroupBysetmealId(setmealId);
            //集合非空判断
            if (CollectionUtil.isNotEmpty(checkGroupList)) {
                //遍历检查组集合
                for (CheckGroup checkGroup : checkGroupList) {
                    //查询检查组id对应的检查项
                    List<CheckItem> checkItems = setmealDao.listCheckItemByCheckGroupId(checkGroup.getId());
                    //
                    checkGroup.setCheckItems(checkItems);
                }
            }
            setmeal.setCheckGroups(checkGroupList);
        }
        return setmeal;
    }

    //优化根据根据检查组获取检查项
    public Setmeal findByIdBatch(Integer id) {
        //1.查询套餐本身详情数据
        Setmeal setmeal = setmealDao.findById(id);
       if (setmeal != null) {
           //2.查询套餐对应的检查组
           Integer setmealId = setmeal.getId();
            List<CheckGroup> checkGroups = setmealDao.findCheckGroupBySetmealId(setmealId);
           List<Integer> ids = new ArrayList<>();
           for (CheckGroup checkGroup : checkGroups) {
               ids.add(checkGroup.getId());
           }

           //所有检查项
           List<CheckItem> checkItems  = setmealDao.findCheckItemsByCheckGroupIds(ids);

           //分组
           Map<Integer, List<CheckItem>> map = new HashMap<>();
           map = checkItems.stream().collect(Collectors.groupingBy(CheckItem::getCheckGroupId));

           for (CheckGroup checkGroup : checkGroups) {
               checkGroup.setCheckItems(map.get(checkGroup.getId()));
           }

           setmeal.setCheckGroups(checkGroups);
       }
        return setmeal;

    }

}
